package view;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JLabel;
import javax.swing.JPanel;

import model.kwalificatiebeheer.Competentie;
import model.kwalificatiebeheer.Competentie;
import model.kwalificatiebeheer.Criterium;
import model.kwalificatiebeheer.Werkproces;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.JTableHeader;
import controller.WerkprocesPanelActions;

public class WerkprocesPanel extends JPanel implements Observer {
	private static final long serialVersionUID = 1L;
	private Werkproces werkproces;
	private JTextField txtTitle;
	private JTextArea txtOmschrijving;
	private JTextArea txtVakEnVa;
	private JTextArea txtResultaat;
	private JTable competentieTable;
	private JButton btnOpslaan;
	private JButton btnCompetentiesToevoegen;
	private JButton btnVerwijderen;
	private Criterium activeCriterium;
	private Competentie activeCompetentie;
	
	public WerkprocesPanel(Werkproces wp) {
		this.werkproces = wp;
		wp.addObserver(this);
		initGui();
	}
	private void initGui(){
		GridBagLayout gridBagLayout = new GridBagLayout();
		gridBagLayout.columnWidths = new int[]{0, 0, 0, 0, 0, 0};
		gridBagLayout.rowHeights = new int[]{0, 0, 0, 30, 0, 0, 30, 0, 0, 10, 0};
		gridBagLayout.columnWeights = new double[]{1.0, 0.0, 1.0, 0.0, 1.0, Double.MIN_VALUE};
		gridBagLayout.rowWeights = new double[]{1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
		setLayout(gridBagLayout);

		JLabel lblTitel = new JLabel("Titel:");
		GridBagConstraints gbc_lblTitel = new GridBagConstraints();
		gbc_lblTitel.anchor = GridBagConstraints.EAST;
		gbc_lblTitel.insets = new Insets(0, 0, 5, 5);
		gbc_lblTitel.gridx = 1;
		gbc_lblTitel.gridy = 1;
		add(lblTitel, gbc_lblTitel);
		
		txtTitle = new JTextField(werkproces.getTitel());
		GridBagConstraints gbc_txtTitle = new GridBagConstraints();
		gbc_txtTitle.gridwidth = 2;
		gbc_txtTitle.insets = new Insets(0, 0, 5, 5);
		gbc_txtTitle.fill = GridBagConstraints.HORIZONTAL;
		gbc_txtTitle.gridx = 2;
		gbc_txtTitle.gridy = 1;
		add(txtTitle, gbc_txtTitle);
		txtTitle.setColumns(10);
		
		JLabel lblOmschrijving = new JLabel("Omschrijving:");
		GridBagConstraints gbc_lblOmschrijving = new GridBagConstraints();
		gbc_lblOmschrijving.anchor = GridBagConstraints.NORTHEAST;
		gbc_lblOmschrijving.insets = new Insets(0, 0, 5, 5);
		gbc_lblOmschrijving.gridx = 1;
		gbc_lblOmschrijving.gridy = 2;
		add(lblOmschrijving, gbc_lblOmschrijving);
		
		txtOmschrijving = new JTextArea();
		txtOmschrijving.setBorder(UIManager.getBorder("Table.scrollPaneBorder"));
		txtOmschrijving.setText(werkproces.getOmschrijving());
		GridBagConstraints gbc_txtOmschrijving = new GridBagConstraints();
		gbc_txtOmschrijving.gridwidth = 2;
		gbc_txtOmschrijving.insets = new Insets(0, 0, 5, 5);
		gbc_txtOmschrijving.fill = GridBagConstraints.BOTH;
		gbc_txtOmschrijving.gridx = 2;
		gbc_txtOmschrijving.gridy = 2;
		add(txtOmschrijving, gbc_txtOmschrijving);
		
		JLabel lblGewenst = new JLabel("Gewenste Resultaat:");
		GridBagConstraints gbc_lblGewenst = new GridBagConstraints();
		gbc_lblGewenst.anchor = GridBagConstraints.NORTHEAST;
		gbc_lblGewenst.insets = new Insets(0, 0, 5, 5);
		gbc_lblGewenst.gridx = 1;
		gbc_lblGewenst.gridy = 3;
		add(lblGewenst, gbc_lblGewenst);
		
		txtResultaat = new JTextArea();
		txtResultaat.setBorder(UIManager.getBorder("Table.scrollPaneBorder"));
		txtResultaat.setText(werkproces.getGewensteResultaat());
		GridBagConstraints gbc_txtResultaat = new GridBagConstraints();
		gbc_txtResultaat.gridwidth = 2;
		gbc_txtResultaat.insets = new Insets(0, 0, 5, 5);
		gbc_txtResultaat.fill = GridBagConstraints.BOTH;
		gbc_txtResultaat.gridx = 2;
		gbc_txtResultaat.gridy = 3;
		add(txtResultaat, gbc_txtResultaat);
		
		JLabel lblVakkennis = new JLabel("Vakkennis en \r\nVaardigheden:");
		lblVakkennis.setVerticalAlignment(SwingConstants.BOTTOM);
		GridBagConstraints gbc_lblVakkennis = new GridBagConstraints();
		gbc_lblVakkennis.anchor = GridBagConstraints.NORTHEAST;
		gbc_lblVakkennis.insets = new Insets(0, 0, 5, 5);
		gbc_lblVakkennis.gridx = 1;
		gbc_lblVakkennis.gridy = 4;
		add(lblVakkennis, gbc_lblVakkennis);
		
		txtVakEnVa = new JTextArea();
		txtVakEnVa.setBorder(UIManager.getBorder("Table.scrollPaneBorder"));
		txtVakEnVa.setText(werkproces.getVakkennisVaardigheden());
		GridBagConstraints gbc_txtVakEnVa = new GridBagConstraints();
		gbc_txtVakEnVa.gridwidth = 2;
		gbc_txtVakEnVa.insets = new Insets(0, 0, 5, 5);
		gbc_txtVakEnVa.fill = GridBagConstraints.BOTH;
		gbc_txtVakEnVa.gridx = 2;
		gbc_txtVakEnVa.gridy = 4;
		add(txtVakEnVa, gbc_txtVakEnVa);
		
		competentieTable = new JTable(new CompetentieTableModel(werkproces));
		competentieTable.addMouseListener(new WerkprocesPanelActions(this));
		competentieTable.setDefaultRenderer(String.class, new MultiLineRenderer());
		competentieTable.setBorder(UIManager.getBorder("Table.scrollPaneBorder"));
		competentieTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		competentieTable.setCellSelectionEnabled(true);
		GridBagConstraints gbc_competentieTable = new GridBagConstraints();
		gbc_competentieTable.fill = GridBagConstraints.BOTH;
		gbc_competentieTable.gridwidth = 3;
		gbc_competentieTable.insets = new Insets(0, 0, 0, 5);
		gbc_competentieTable.gridx = 1;
		gbc_competentieTable.gridy = 6;
		add(new JScrollPane(competentieTable), gbc_competentieTable);
		
		JTableHeader tableHeader = competentieTable.getTableHeader();
		tableHeader.setReorderingAllowed(false);
		tableHeader.setBorder(UIManager.getBorder("Table.scrollPaneBorder"));
		gbc_lblTitel.insets = new Insets(0, 0, 5, 0);
		gbc_competentieTable.gridy = 5;
		add(tableHeader, gbc_competentieTable);
		
		btnCompetentiesToevoegen = new JButton("Competenties Toevoegen");
		btnCompetentiesToevoegen.addActionListener(new WerkprocesPanelActions(this));
		
		btnVerwijderen = new JButton("Verwijderen");
		btnVerwijderen.addActionListener(new WerkprocesPanelActions(this));		
		btnVerwijderen.setActionCommand("btnDelete");
		GridBagConstraints gbc_btnVerwijderen = new GridBagConstraints();
		gbc_btnVerwijderen.anchor = GridBagConstraints.WEST;
		gbc_btnVerwijderen.insets = new Insets(0, 0, 5, 5);
		gbc_btnVerwijderen.gridx = 1;
		gbc_btnVerwijderen.gridy = 7;
		add(btnVerwijderen, gbc_btnVerwijderen);
		
		btnCompetentiesToevoegen.setActionCommand("btnAddCompetentie");
		GridBagConstraints gbc_btnCompetentiesToevoegen = new GridBagConstraints();
		gbc_btnCompetentiesToevoegen.anchor = GridBagConstraints.EAST;
		gbc_btnCompetentiesToevoegen.insets = new Insets(0, 0, 5, 5);
		gbc_btnCompetentiesToevoegen.gridx = 3;
		gbc_btnCompetentiesToevoegen.gridy = 7;
		add(btnCompetentiesToevoegen, gbc_btnCompetentiesToevoegen);
		
		btnOpslaan = new JButton("Opslaan");
		btnOpslaan.addActionListener(new WerkprocesPanelActions(this));
		btnOpslaan.setActionCommand("btnSave");
		GridBagConstraints gbc_btnOpslaan = new GridBagConstraints();
		gbc_btnOpslaan.anchor = GridBagConstraints.EAST;
		gbc_btnOpslaan.insets = new Insets(0, 0, 5, 5);
		gbc_btnOpslaan.gridx = 3;
		gbc_btnOpslaan.gridy = 8;
		add(btnOpslaan, gbc_btnOpslaan);
	}
	
	public Werkproces getWerkproces() {
		return werkproces;
	}
	
	@Override
	public void update(Observable arg0, Object arg1) {
		competentieTable.setModel(new CompetentieTableModel(werkproces));
		revalidate();
	}

	public JTextField getTxtTitle() {
		return txtTitle;
	}

	public JTextArea getTxtOmschrijving() {
		return txtOmschrijving;
	}

	public JTextArea getTxtVakEnVa() {
		return txtVakEnVa;
	}

	public JTextArea getTxtResultaat() {
		return txtResultaat;
	}

	public JTable getCompetentieTable() {
		return competentieTable;
	}
	public Competentie getActiveCompetentie() {
		return activeCompetentie;
	}
	public void setActiveCompetentie(Competentie activeCompetentie) {
		this.activeCompetentie= activeCompetentie;
	}
	public Criterium getActiveCriterium() {
		return activeCriterium;
	}
	public void setActiveCriterium(Criterium activeCriterium) {
		this.activeCriterium = activeCriterium;
	}
}